// encoding utf-8
#ifndef __QyRender__
#define __QyRender__

#include <QtCore/QList>
#include <QtOpenGL>

//! Пространство имен базовой системы рендринга
namespace QyRender {

class Layer;
class ItemList;

/*! @defgroup RenderCore Базовая система рендринга
*/

/*! \class QyRender::Painter
    \brief Рендер. Отвечает за отрисовку и выбор элементов.
    \ingroup RenderCore

    Рендер рисует элементы привязанных к нему слоев в порядке возрастания параметра глубины слоев
    (см QyRender::Layer).

    Алгоритм выбора объектов:
    * подготовка текущего OpenGL-контекста к выбору (переводит OpenGL в    режим выбора, определяет
    область выбора, очищает и инициализирует стэк имен и т.д.);
    * Вызов метода Painter::select;
    * перевод OpenGL в режим рисования (или любой др) для получения количества попаданий;
    * вызов метода Painter::itemsFromGLSelectBuffer, первым параметров передаеться буффер выбора,
    вторым число попаданий;
    * заключительные мероприятия.

    При этом Painter::itemsFromGLSelectBuffer вернет список элементов в которые было "попадение" в
    порядке возрастания, т.е. чем выше элемент на экране, тем выше он в списке.

*/
class Painter {
public:
    explicit Painter();
    virtual ~Painter();

    QList<Layer*> layers() const { return p_layers; } //!< Список слоев привязанных к рендеру
    ItemList itemsFromGLSelectBuffer( GLuint * buffer, GLuint length ) const; //!< Обработать результат выделения

    virtual void paint(); //!< Отрисовать элементы
    void select(); //!< Отрисовать элементы для режима выбора. Режим выбора должен быть инициализирован до вызова этого метода
    void arrange(); //!< Пересортировать слои. Обычно это происходит автоматически, но можно и вручную
    void addLayer( Layer * layer ); //!< Привязать слой к рендеру. Если вызывать метод QyRender::Layer::setPainter, то привязка произойдет несколько быстрее
    void removeLayer( Layer * layer ); //!< Разрушить привязку слоя к рендеру. Если вызывать метод QyRender::Layer::setPainter(0), то разрыв связи произойдет несколько быстрее

private:
    QList<Layer*> p_layers; // список слоев

};

};

#endif//__QyRender__
